package a06_BlockQueue;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;

/**
 * @Author quan
 * @Description 用两个线程实现生产者与消费者模型
 * @Date 2023/5/7 16:18
 */
public class a03_Producer_Customer {
    //模拟目标：将生产者生产的商品先放入消息队列中存储，等过10秒之后，消费者再开始消费
    //1、定义一个阻塞队列
    private static BlockingQueue queue = new LinkedBlockingQueue(100);
    public static void main(String[] args) {
        //2、创建生产者线程
        Thread producer = new Thread(()->{
            int goods = 1;
            //3、生产者开始不停的生产
            while (true){
                System.out.println("生产了商品："+goods);
                try {
                    //4、将生产的商品先放入阻塞队列中
                    queue.put(goods);
                    goods++;
                    //等待10ms生产一个，不然打印太快
                    TimeUnit.MICROSECONDS.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        producer.start();
        //5、创建消费者
        Thread customer = new Thread(()->{
            while (true){
                //6、消费者开始从阻塞队列中获取商品
                try {
                    int goods = (int) queue.take();
                    System.out.println("消费了商品："+goods);
                    // 休眠1秒
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        customer.start();
    }
}
